package com.yujiahao.bigdata.rdd.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  TODO combineByKey;这个第一个参数的数据类型是动态生成的，所以要将类型进行声明，也能实现WordCount（6 /10)
    >>rdd.combineByKey()参数说明 ：
      1)第一个参数表示相同K的第一个数据格式的转换；
      2)第二个参数：表示分区内计算规则；
      3)第三个参数：表示分区间的计算规则
 */

object Spark_RDD_Pper_Transform_CombineByKey_Values {
  def main(args: Array[String]): Unit = {


  //TODO 1、获得连接
  val conf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local")
  val sc: SparkContext = new SparkContext(conf)

    // TODO 算子 - 行动算子

    val rdd : RDD[Int] = sc.makeRDD(List(1,2,3,4),2)

    // TODO countByKey

    // countByKey算子需要数据格式为KV类型
    // 相同key的数据的数量
    // List(1,2,3,4) => List((a,1),(a,1),(a,1),(a,1))
    // TODO countByKey算子可以实现WordCount( 7 / 10 )
    //val map: collection.Map[String, Long] = rdd.map(("a", _)).countByKey()
    //println(map)

    // TODO countByValue
    // countByValue算子用于统计数据集中相同的值的数量
    // TODO countByValue算子可以实现WordCount( 8 / 10 )
    val map = rdd.map(
      num => {
        (1, 1)
      }
    ).countByValue()
    println(map)
    //TODO 2、关闭
    sc.stop()

  }
}
